/*
 * @Description: 路由中间件（中转）
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2020-11-09 09:59:34
 * @LastEditTime: 2020-11-10 18:21:50
 */

const Router = require('@koa/router')
const router = new Router()
const { OPEN_API_LIST, ERR } = require('../../config') //引入api白名单及错误抛出配置
const UserModel = require('../db/models/user') //用户Model
const { decodeToken } = require('../utils/encryptToken') //token解析
const redis = require('../utils/redis') //redis

/* 路由 */
const User = require('./user')

//接口访问限制中间件（token锁）
//这里判断如果403，前台需要跳转到登陆页面
router.use(async (ctx, next) => {
    //白名单api直接跳过
    if (OPEN_API_LIST.includes(ctx.originalUrl)) {
        await next()
        return
    }

    //获取请求头中的token
    const token = ctx.headers.token
    if (!token) {
        ERR.e403()
        return
    }

    //这里判断token是否合法
    const { userid, loginTime } = decodeToken(token)
    if (!userid || userid.length != 24) {
        ERR.e403()
        return
    }

    //与数据库比对是否有此用户
    const user = await UserModel.findById(userid)
    if (!user) {
        ERR.e403('token对应的用户不存在')
        return
    }

    //使用userid去redis中查询，如果存在且相同，则next()，如果不存在或不同，则已过期
    const redisToken = await redis.get(userid)
    if (!redisToken || redisToken != token) {
        ERR.e403('抱歉，您的登陆已过期')
    } else {
        ctx.curUserInfo = { userid, loginTime } //通过ctx向子路由传值
        await next()
    }
})

// 启动路由和中间件
router.use(User.routes(), User.allowedMethods())

module.exports = router
